package middleware

import (
	"gin_api/app/service"
	"gin_api/core/response"
	"github.com/gin-gonic/gin"
	"strings"
)

type Authentication struct {
}

func (a Authentication) Verify() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在Header的Authorization中，并使用Bearer开头
		// 这里的具体实现方式要依据你的实际业务情况决定
		authorization := c.Request.Header.Get("Authorization")
		if authorization == "" {
			response.New(c).FailWithMessage(401, "Authentication Failed")
			return
		}
		// 按空格分割
		parts := strings.SplitN(authorization, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			response.New(c).FailWithMessage(401, "Authentication Failed")
			return
		}

		// 解析token
		// parts[1]是获取到的tokenString，我们使用之前定义好的解析JWT的函数来解析它
		auth, err := service.ParseToken(parts[1])
		if err != nil {
			response.New(c).FailWithMessage(401, err.Error())
			return
		}

		// 将当前请求的username信息保存到请求的上下文c上
		// 后续的处理函数可以用过c.Get("auth")来获取当前请求的用户信息
		c.Set("username", auth.Username)
		c.Next()
	}
}
